package com.taoye.thread;

import java.util.ArrayList;
import java.util.List;

public class Demo29 {
	public static void main(String[] args) throws InterruptedException {
		List<Integer> list = new ArrayList<>();
		Thread t = new Demo29ThreadA(list);
		t.setName("A");
		t.start();
		Thread t1 = new Demo29ThreadB(list);
		t1.setName("B");
		t1.start();
		Thread.sleep(5000);
		System.out.println("list的大小："+list.size());
	}
}

class Demo29Service {
	private Object lock = new Object();

	public void add(List<Integer> list) {
		/**
		 * 这里不管是使用this还是lock都无法锁定，因为不管是this对象代表的service实例，
		 * 还是service实例里面的object对象，都是在线程里面new出来的，并非线程公共的对象
		 * 不是公共的对象是无法使用synchronized语句块来锁定对象的
		 */
		synchronized(list) {
			try {
				if(list.size() < 1) {
					Thread.sleep(2000);
					list.add(1);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

class Demo29ThreadA extends Thread {
	private List<Integer> list;

	public Demo29ThreadA(List<Integer> list) {
		this.list = list;
	}

	@Override
	public void run() {
		//注意，在A、B线程里new了不同的service对象
		Demo29Service service = new Demo29Service();
		service.add(list);
	}
}

class Demo29ThreadB extends Thread {
	private List<Integer> list;

	public Demo29ThreadB(List<Integer> list) {
		this.list = list;
	}

	@Override
	public void run() {
		//注意，在A、B线程里new了不同的service对象
		Demo29Service service = new Demo29Service();
		service.add(list);
	}
}
